package br.com.velp.sudecap.serviceimpl;

import br.com.velp.sudecap.comum.SpringConstants;
import br.com.velp.sudecap.comum.ValidationException;
import br.com.velp.sudecap.dao.UsuarioDAO;
import br.com.velp.sudecap.dto.UsuarioParametrosConsultaDTO;
import br.com.velp.sudecap.dto.UsuarioResultadoConsultaDTO;
import br.com.velp.sudecap.entidade.*;
import br.com.velp.sudecap.enumerator.AuditoriaClasseEnum;
import br.com.velp.sudecap.service.UsuarioService;
import br.com.velp.sudecap.util.CriptografiaUtil;
import br.com.velp.sudecap.util.ValidaDocumentosUtil;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.hibernate.criterion.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * <sumario> 
 * <objetivo> "Rastreabilidade" </objetivo> 
 * <autor> EDUARDO SANTOS DE OLIVEIRA </autor> 
 * <versao>1.0.0.0</versao> 
 * <data_criacao> 06.11.2012 </data_criacao> 
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisitos_afetados> RF001.02 - Listar Usuários / RF001.03 - Cadastrar Usuários </requisitos_afetados> 
 * <descricao> Implementação da Interface Responsável Pelas 
 *             Operações de CRUD Referentes ao Contexto de Usuários
 * </descricao> 
 * </sumario>
 */
@Service("usuarioService")
@Transactional(readOnly = true)
@Lazy(SpringConstants.LAZY_BEANS)
public class UsuarioServiceImpl implements UsuarioService {

    public static final Long serialVersionUID = 1L;
    
    @Autowired
    private UsuarioDAO usuarioDAO;

    @Transactional(readOnly = false)
    @Override
    public Long salvar(Usuario usuario) throws Exception {
        validarUsuario(usuario);
        usuario.setSenha(CriptografiaUtil.criptografar(CriptografiaUtil.ALGORITMO.MD5, usuario.getSenha()));
        return this.usuarioDAO.salvar(usuario);
    }

    @Transactional(readOnly = false)
    @Override
    public void atualizar(Usuario usuario) throws Exception {
        validarUsuario(usuario);
        if (this.usuarioDAO.senhaAlterada(usuario)) {
            usuario.setSenha(CriptografiaUtil.criptografar(CriptografiaUtil.ALGORITMO.MD5, usuario.getSenha()));
        }
        this.usuarioDAO.atualizar(usuario);
    }

    @Transactional(readOnly = false)
    @Override
    public void excluir(Usuario usuario) throws ValidationException {
        if (this.usuarioDAO.usuarioPresenteAuditoriaSistema(usuario, AuditoriaClasseEnum.getClasses())) {
            throw new ValidationException("usuario_validacao_registros_auditoria");
        }
        this.usuarioDAO.excluir(usuario);
    }

    @Override
    public Usuario obterPorId(Long idEmpreendimento) {
        return this.usuarioDAO.obterPorId(idEmpreendimento);
    }

    @Override
    public int contarUsuarios(UsuarioParametrosConsultaDTO parametros) {
        return this.usuarioDAO.contarUsuarios(parametros);
    }

    @Override
    public List<Usuario> buscarUsuariosPaginados(int firstResult, int maxResults,
            UsuarioParametrosConsultaDTO parametros, Order order) {
        return this.usuarioDAO.buscarUsuariosPaginados(firstResult, maxResults, parametros, order);
    }

    @Override
    public Usuario recuperarUsuarioPorLoginSenha(String login, String senha) {
        return this.usuarioDAO.recuperarUsuarioPorLoginSenha(login, senha);
    }

    @Override
    public List<DireitoSistema> recuperarPrivilegiosUsuario(Usuario usuario, String sistema) {
        return this.usuarioDAO.recuperarPrivilegiosUsuario(usuario, sistema);
    }

    @Override
    public List<Diretoria> carregarTodasDiretorias() {
        return this.usuarioDAO.carregarTodasDiretorias();
    }

    @Override
    public List<Local> carregarTodosLocais() {
        return this.usuarioDAO.carregarTodosLocais();
    }

    @Override
    public List<Setor> carregarTodosSetores() {
        return this.usuarioDAO.carregarTodosSetores();
    }
    
    @Override
    public List<Usuario> obterTodosUsuarios() {
        return this.usuarioDAO.obterTodosUsuarios();
    }
    
    @Override
    public UsuarioResultadoConsultaDTO recuperarUsuarioDTOPorLoginSenha(String login, String senha) {
        return this.usuarioDAO.recuperarUsuarioDTOPorLoginSenha(login, senha);
    }

    private void validarUsuario(Usuario usuario) throws ValidationException {
        ValidationException ve = new ValidationException();
        if (this.usuarioDAO.usuarioJaCadastradoLogin(usuario)) {
            ve.adicionarMensagem("usuarioJaCadastradoLogin");
        }
        if (this.usuarioDAO.usuarioJaCadastradoMatricula(usuario)) {
            ve.adicionarMensagem("usuarioJaCadastradoMatricula");
        }
	if (this.usuarioDAO.usuarioJaCadastradoCpf(usuario)){
	    ve.adicionarMensagem("usuario_validacao_cpf_cadastrado");
	}
	if (StringUtils.isNotBlank(usuario.getCpf()) && !ValidaDocumentosUtil.isCpfValido(usuario.getCpf())){
	    ve.adicionarMensagem("usuario_validacao_cpf_invalido");
	}
        if (ve.hasErros()) {
            throw ve;
        }
    }
}
